递归算法的应用(迷宫)

题目:给定一个m*n的迷宫,找到任意两个点之间的路径!如图所示

引用块内容
这是一个10*10的矩阵,标记为0的代表不可以走,1代表可以走,找出起点(1,1)到终点(8,8)的路径。

解题思路:对于任何一个位置(i,j),下一步共有4个方向可以选择,包括向上(i-1,j),向下(i+1,j),向左(i,j-1),向右(i,j+1);走过的点必须标记出来,避免下一次重新走,如果走到某个位置走不通了,必须退回上一个点,寻找其他路径。考虑使用递归来解决。

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
#define StartX 1
#define StartY 1
#define EndX   8
#define EndY   8
int TraceRoute(int a[][10],int i,int j){
    //1.用2标记当前的点已经走过
    a[i][j]=2;
    //2.标记是否结束,end=0表示还未到终点
    int end=0;
    if(i==EndX&&j==EndY){
        end=1;
    }
    //3.路线选择,共有4种走法
    if(end!=1&&i+1<=EndX&&a[i+1][j]==1){  //下
            if(TraceRoute(a,i+1,j)==1)  return 1;
    }
    if(end!=1&&i-1>=StartX&&a[i-1][j]==1){  //上
            if(TraceRoute(a,i-1,j)==1)  return 1;
    }
    if(end!=1&&j-1>=StartY&&a[i][j-1]==1){  //左
            if(TraceRoute(a,i,j-1)==1)  return 1;
    }
    if(end!=1&&j+1<=EndY&&a[i][j+1]==1){  //右
            if(TraceRoute(a,i,j+1)==1)  return 1;
    }
    //4.如果走到了死胡同并且没有到达终点,走不通,将当前点还原为1
    if(end!=1){
        a[i][j]=1;  
    }
    return end;
}
int main(){
        int a[10][10] = {
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
            { 0, 1, 1, 0, 1, 1, 1, 0, 1, 0 },
            { 0, 1, 1, 0, 1, 1, 1, 0, 1, 0 },
            { 0, 1, 1, 1, 1, 0, 0, 1, 1, 0 },
            { 0, 1, 0, 0, 0, 1, 1, 1, 1, 0 },
            { 0, 1, 1, 1, 0, 1, 1, 1, 1, 0 },
            { 0, 1, 0, 1, 1, 1, 0, 1, 1, 0 },
            { 0, 1, 0, 0, 0, 1, 0, 0, 1, 0 },
            { 0, 0, 1, 1, 1, 1, 1, 1, 1, 0 },
            { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
    };
    for (int i = 0; i <= 9; i++){
        for (int j = 0; j <= 9; j++){
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    cout << endl;
    TraceRoute(a,1,1);
    for (int i = 0; i <= 9; i++){
        for (int j = 0; j <= 9; j++){
            cout << a[i][j] << " ";
        }
        cout << endl;
    }
    system("pause");
    return 0;
}
//注意:在递归过程中,遍历的顺序影响路径的不同,答案并非唯一

这里写图片描述

拓展:我们知道,任何递归实现的函数均可以用栈来实现。我们也可以使用栈来实现迷宫,但是比较繁琐,就不写了,大家自己去找度娘,不建议掌握,面试的时候不会让写这么复杂的代码,递归已经足够了。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值